﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <assert.h>

//int main()
//{
//	char p[] = { 'b', 'i', 't' ,'\0'};
//	printf("%s\n", p);
//	return 0;
//}

//int main()
//{
//	
//	int arr1[] = { 1, 2, 3 };
//	int arr2[] = { 2, 3, 4 };
//	int arr3[] = { 4, 5, 6 };
//	int* arr[3] = { arr1, arr2, arr3 };//指针数组
//	printf("%d\n", *(*(arr + 0) + 1));
//	int a[] = { 1, 2, 3, 4, 5, 6, 7 };
//	int* p = &a;
//	printf("%d\n", *(p+1));
//	int b[] = { 1, 2, 3, 4, 5 };
//	int *p1;//p1+1，跳过四个字节
//	int *p2 = arr;//p2+1跳过一个元素，元素类型为整形即为四个字节
//	//int(*p)[7] = &a;//数组指针，七个元素,数组类型，即+1跳过一个数组。
//	return 0;
//}

//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int main()
//{
//	int(*pf)(int, int) = Add;
//	printf("%d\n", (*pf)(1, 2));
//	printf("%d\n", pf(1, 2));
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8 };
//	int(*p)[10] = &arr;
//
//	printf("%p\n", &Add);
//	printf("%p\n", Add);
//	int(*pf)(int, int) = Add;
//	printf("%d\n", (*pf)(1, 2));
//	//函数名是函数的地址
//	//&函数名仍然是函数的地址
//	//(*pf)(int, int)与pf(int, int)相等。
//	int* ps = NULL;
//	//assert(ps != NULL);
//	//(*(void(*)())0)()
//	//(*(         )0)()
//	//   void(*)()函数指针类型 <---> int 整形类型
//	//将0地址强制转换成函数指针类型，返回类型为void，
//	//*0即为解引用0，把0所在的地址取出来。
//
//	return 0;
//
//}
//
//int test()
//{
//	printf("QQHSJ\n");
//	return 0;
//}
//
//int main()
//{
//	test();
//	printf("%p\n", test);
//	(*(int(*)())test)();
//	return 0;
//}
//#include <stdio.h>
//int main()
//{
//
//	int arr1[] = { 1, 2, 3 };
//	int arr2[] = { 7, 8, 9, 10 };
//	int arr3[] = { 4, 5, 6 };
//	int a = 4;
//	int b = 1;
//	int c = 2;
//	int* arr[] = { arr1, arr2, arr3, &a, &b, &c };
//	printf("%d %d %d\n", *(*(arr + 1) + 3), *(*(arr + 2) + 2), *(*(arr+3)));
//	printf("%d\n", sizeof(&arr));
//}

//#include <stdio.h>
//int main()
//{
//	int arr[10] = { 0 };
//	printf("arr = %p\n", arr);
//	printf("&arr= %p\n", &arr);
//	printf("arr+1 = %p\n", arr + 1);
//	printf("&arr+1= %p\n", &arr + 1);
//	return 0;
//}
	//int arr[] = { 1, 2, 3, 4, 5 };
	//int(*p)[5] = &arr;
	//printf("%d\n", *((*p)+1));
//#include <stdio.h>
//int main()
//{
//
//	int arr1[] = { 1, 2, 3 };
//	int arr2[] = { 4, 5, 6 };
//	int arr3[] = { 7, 8, 9 };
//
//	int(*parr[3])[3] = { &arr1, &arr2, &arr3 };
//	//如何输出里面的具体值？
//	printf("%d\n", *(*(*(parr+1))+1));
//
//	return 0;
//
//}

int add(int x, int y)
{
	return x + y;
}

int sub(int x, int y)
{
	return x - y;
}

int mul(int x, int y)
{
	return x * y;
}

int div(int x, int y)
{
	return x / y;
}

void Caculate(int(*pf)(int, int))
{
	int x, y;
	int ret = 0;
	printf("输入操作数：");
	scanf("%d %d", &x, &y);
	ret = pf(x, y);
	printf("ret = %d\n", ret);
}

int main()
{
	int input = 1;
	do
	{
		printf("**************************\n");
		printf("**1:add************2:sub**\n");
		printf("**3:mul************4:div**\n");
		printf("**************************\n");
		printf("请选择：");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			Caculate(add);
			break;
		case 2:
			Caculate(sub);
			break;
		case 3:
			Caculate(mul);
			break;
		case 4:
			Caculate(div);
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);

	return 0;
}


//int main()
//{
//	int x, y;
//	int input = 1;
//	int ret = 0;
//	int(*p[4])(int x, int y) = {Add, Sub, Mul, Div }; //转移表
//	while (input)
//	{
//		printf("**************************\n");
//		printf("**1:add************2:sub**\n");
//		printf("**3:mul************4:div**\n");
//		printf("**************************\n");
//		printf("请选择：");
//		scanf("%d", &input);
//		if ((input <= 4 && input >= 1))
//		{
//			printf("输入操作数：");
//			scanf("%d %d", &x, &y);
//			ret = p[input](x, y);
//		}
//		else
//			printf("输入有误\n");
//		printf("ret = %d\n", ret);
//	}
//	return 0;
//}

//int main()
//{
//	int a[] = { 1, 2, 3, 4 };
//	printf("%d\n", sizeof(a + 1));
//	printf("%d\n", sizeof(int *));
//}